home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc International / Development / TSMTEsample⁄1.1 / Source / SampleCollections.cpp < prev    next >
Encoding:
Text File  |  1996-11-14  |  13.2 KB  |  635 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Collections.cpp
  3.  
  4.     Contains:    Sample collection functions & classes
  5.  
  6.     Written by:    Steve Smith
  7.  
  8.     Copyright:    © 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Description:
  11.                 CList: Generic unordered list
  12.                 COrderedList: Generic ordered list
  13.                 CFrameList: Unordered list of frames -
  14.                             frames automatically refcounted when 
  15.                             added/removed from list.
  16.                 CQueue: Generic queue collection
  17.                 CStack: Generic stack collection
  18. */
  19.  
  20.  
  21. // -- Compiler/Preprocessor Switches --
  22.  
  23. #ifndef _COMPILERDEFS_
  24. #include "CompDefs.h"
  25. #endif
  26.  
  27. // -- OpenDoc Utilities --
  28.  
  29. #ifndef _EXCEPT_
  30. // Exceptions define several important macros (ie. CHECKENV)
  31. // which are used in the SOM method dispatch glue. If Except.h
  32. // is not included early enough, exceptions may not be thrown
  33. // correctly when returning from a SOM method with "ev" parameter set.
  34. #include <Except.h>
  35. #endif
  36.  
  37. // --- SamplePart Includes ---
  38.  
  39. #ifndef _SAMPLECOLLECTIONS_
  40. #include "SampleCollections.h"
  41. #endif
  42.  
  43. // --- OpenDoc Includes ---
  44.  
  45. #ifndef _ODTYPES_
  46. #include <ODTypes.h>
  47. #endif
  48.  
  49. #ifndef SOM_ODFrame_xh
  50. #include <Frame.xh>
  51. #endif
  52.  
  53. #ifndef SOM_ODDraft_xh
  54. #include <Draft.xh>
  55. #endif
  56.  
  57. #ifndef SOM_Module_OpenDoc_Errors_defined
  58. #include <ErrorDef.h>
  59. #endif
  60.  
  61. // --- OpenDoc Utilities ---
  62.  
  63. #ifndef _ODDEBUG_
  64. #include <ODDebug.h>
  65. #endif
  66.  
  67. #ifndef _ODNEW_
  68. #include <ODNew.h>
  69. #endif
  70.  
  71. #ifndef _LINKLIST_
  72. #include <LinkList.h>
  73. #endif
  74.  
  75. #ifndef _ODUTILS_
  76. #include <ODUtils.h>
  77. #endif
  78.  
  79.  
  80. //====================================================================
  81. // CFrameLink
  82. //====================================================================
  83.  
  84. CFrameLink::CFrameLink(ODFrame* frame)
  85.     :CGenericLink()
  86. {
  87.     Environment* ev = somGetGlobalEnvironment();
  88.     ODAcquireObject(ev, frame);
  89.     fValue = (ODPtr)frame;
  90. }
  91.  
  92. CFrameLink::~CFrameLink()
  93. {
  94.     Environment* ev = somGetGlobalEnvironment();
  95.     ODFrame* currentFrame = (ODFrame*)fValue;
  96.     ODReleaseObject(ev, currentFrame);
  97. }
  98.  
  99. ODFrame* CFrameLink::GetFrame()
  100. {
  101.     return ((ODFrame*)fValue);
  102. }
  103.  
  104. void CFrameLink::SetFrame(ODFrame* frame)
  105. {
  106.     Environment* ev = somGetGlobalEnvironment();
  107.     ODAcquireObject(ev, frame);
  108.     
  109.     ODFrame* currentFrame = (ODFrame*)fValue;
  110.     ODReleaseObject(ev, currentFrame);
  111.     
  112.     fValue = (ODPtr)frame;
  113. }
  114.  
  115. //====================================================================
  116. // CList
  117. //====================================================================
  118.  
  119. ODBoolean CList::Contains(const ODPtr value)
  120. {
  121.     if ( fList.IsEmpty() ) return kODFalse;
  122.     
  123.     LinkedListIterator    iter(&fList);
  124.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  125.     {
  126.         if ( ((CGenericLink*)link)->GetValue() == value )
  127.             return kODTrue;
  128.     }
  129.  
  130.     return kODFalse;
  131. }
  132.  
  133. void CList::DeleteAllLinks()
  134. {
  135.     LinkedListIterator    iter(&fList);
  136.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  137.     {
  138.         delete (((CGenericLink*)link)->GetValue());
  139.     }
  140.     fList.RemoveAll();
  141. }
  142.  
  143. void CList::Delete(ODPtr value)
  144. {
  145.     LinkedListIterator    iter(&fList);
  146.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  147.     {
  148.         if ( ((CGenericLink*)link)->GetValue() == value )
  149.         {
  150.             delete (((CGenericLink*)link)->GetValue());
  151.             fList.Remove(*link);
  152.             return;
  153.         }
  154.     }
  155. }
  156.  
  157. void CList::Remove(ODPtr value)
  158. {
  159.     LinkedListIterator    iter(&fList);
  160.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  161.     {
  162.         if ( ((CGenericLink*)link)->GetValue() == value )
  163.         {
  164.             fList.Remove(*link);
  165.             return;
  166.         }
  167.     }
  168. }
  169.  
  170. void CList::Add(ODPtr value)
  171. {
  172.     CGenericLink* link = new CGenericLink(value);
  173.     fList.AddLast(link);
  174. }
  175.  
  176.  
  177. //====================================================================
  178. // CListIterator
  179. //====================================================================
  180.  
  181. CListIterator::CListIterator(CList* list)
  182. {
  183.     fIter = new LinkedListIterator(&list->fList);
  184. }
  185.  
  186. CListIterator::~CListIterator()
  187. {
  188.     delete fIter;
  189. }
  190.     
  191. ODPtr CListIterator::First()
  192. {
  193.     CGenericLink* link = (CGenericLink*) fIter->First();
  194.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  195. }
  196.  
  197. ODPtr CListIterator::Next()
  198. {
  199.     CGenericLink* link = (CGenericLink*) fIter->Next();
  200.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  201. }
  202.  
  203. ODPtr CListIterator::Previous()
  204. {
  205.     CGenericLink* link = (CGenericLink*) fIter->Previous();
  206.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  207. }
  208.  
  209. ODPtr CListIterator::Last()
  210. {
  211.     CGenericLink* link = (CGenericLink*) fIter->Last();
  212.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  213. }
  214.  
  215. ODPtr CListIterator::Current()
  216. {
  217.     CGenericLink* link = (CGenericLink*) fIter->Current();
  218.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  219. }
  220.  
  221. ODBoolean CListIterator::IsNotComplete()
  222. {
  223.     return fIter->IsNotComplete();
  224. }
  225.  
  226. void CListIterator::RemoveCurrent()
  227. {
  228.     fIter->RemoveCurrent();
  229. }
  230.  
  231. void CListIterator::DeleteCurrent()
  232. {
  233.     CGenericLink* link = (CGenericLink*) fIter->Current();
  234.     fIter->RemoveCurrent();
  235.     if ( link ) {
  236.         delete link->GetValue();
  237.         delete link;
  238.     }
  239. }
  240.  
  241. //====================================================================
  242. // COrderedList
  243. //====================================================================
  244.  
  245. ODBoolean COrderedList::Contains(const ODPtr value)
  246. {
  247.     if ( fList.IsEmpty() ) return kODFalse;
  248.     
  249.     LinkedListIterator    iter(&fList);
  250.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  251.     {
  252.         if ( ((CGenericLink*)link)->GetValue() == value )
  253.             return kODTrue;
  254.     }
  255.  
  256.     return kODFalse;
  257. }
  258.  
  259. ODUShort COrderedList::Position(const ODPtr value)
  260. {
  261.     if ( fList.IsEmpty() ) return kListIsEmpty;
  262.     
  263.     ODUShort position = 0;
  264.     LinkedListIterator    iter(&fList);
  265.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  266.     {
  267.         position++;
  268.         if ( ((CGenericLink*)link)->GetValue() == value )
  269.             return kODTrue;
  270.     }
  271.  
  272.     return kItemNotFound;
  273. }
  274.  
  275. void COrderedList::DeleteAllLinks()
  276. {
  277.     LinkedListIterator    iter(&fList);
  278.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  279.     {
  280.         delete (((CGenericLink*)link)->GetValue());
  281.     }
  282.     fList.RemoveAll();
  283. }
  284.  
  285. void COrderedList::Delete(ODPtr value)
  286. {
  287.     LinkedListIterator    iter(&fList);
  288.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  289.     {
  290.         if ( ((CGenericLink*)link)->GetValue() == value )
  291.         {
  292.             delete (((CGenericLink*)link)->GetValue());
  293.             fList.Remove(*link);
  294.             return;
  295.         }
  296.     }
  297. }
  298.  
  299. void COrderedList::Remove(ODPtr value)
  300. {
  301.     LinkedListIterator    iter(&fList);
  302.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  303.     {
  304.         if ( ((CGenericLink*)link)->GetValue() == value )
  305.         {
  306.             fList.Remove(*link);
  307.             return;
  308.         }
  309.     }
  310. }
  311.  
  312. ODPtr COrderedList::RemoveFirst()
  313. {
  314.     CGenericLink* link = (CGenericLink*) fList.RemoveFirst();
  315.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  316. }
  317.  
  318. ODPtr COrderedList::RemoveLast()
  319. {
  320.     CGenericLink* link = (CGenericLink*) fList.RemoveLast();
  321.     return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  322. }
  323.  
  324. void COrderedList::AddBefore(const ODPtr existing, ODPtr value)
  325. {
  326.     LinkedListIterator    iter(&fList);
  327.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  328.     {
  329.         if ( ((CGenericLink*)link)->GetValue() == existing )
  330.         {
  331.             CGenericLink* newLink = new CGenericLink(value);
  332.             fList.AddBefore(*link,newLink);
  333.             return;
  334.         }
  335.     }
  336. }
  337.  
  338. void COrderedList::AddAfter(const ODPtr existing, ODPtr value)
  339. {
  340.     LinkedListIterator    iter(&fList);
  341.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  342.     {
  343.         if ( ((CGenericLink*)link)->GetValue() == existing )
  344.         {
  345.             CGenericLink* newLink = new CGenericLink(value);
  346.             fList.AddAfter(*link,newLink);
  347.             return;
  348.         }
  349.     }
  350. }
  351.  
  352. void COrderedList::AddFirst(ODPtr value)
  353. {
  354.     CGenericLink* link = new CGenericLink(value);
  355.     fList.AddFirst(link);
  356. }
  357.  
  358. void COrderedList::AddLast(ODPtr value)
  359. {
  360.     CGenericLink* link = new CGenericLink(value);
  361.     fList.AddLast(link);
  362. }
  363.  
  364. ODPtr COrderedList::After(const ODPtr value) const
  365. {
  366.     LinkedListIterator    iter((LinkedList*)&fList);
  367.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  368.     {
  369.         if ( ((CGenericLink*)link)->GetValue() == value )
  370.         {
  371.             Link* after = fList.After(*link);
  372.             return after ? (ODPtr)((CGenericLink*)after)->GetValue()
  373.                             : (ODPtr)kODNULL;
  374.         }
  375.     }
  376.     return kODNULL;
  377. }
  378.  
  379. ODPtr COrderedList::Before(const ODPtr value) const
  380. {
  381.     LinkedListIterator    iter((LinkedList*)&fList);
  382.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  383.     {
  384.         if ( ((CGenericLink*)link)->GetValue() == value )
  385.         {
  386.             Link* before = fList.Before(*link);
  387.             return before ? (ODPtr)((CGenericLink*)before)->GetValue()
  388.                             : (ODPtr)kODNULL;
  389.         }
  390.     }
  391.     return kODNULL;
  392. }
  393.  
  394. ODPtr COrderedList::First() const
  395. {
  396.     CGenericLink* link = (CGenericLink*) fList.First();
  397.     return link ? (ODPtr)link->GetValue() : (ODPtr)kODNULL;
  398. }
  399.  
  400. ODPtr COrderedList::Last() const
  401. {
  402.     CGenericLink* link = (CGenericLink*) fList.Last();
  403.     return link ? (ODPtr)link->GetValue() : (ODPtr)kODNULL;
  404. }
  405.  
  406.  
  407. //====================================================================
  408. // CFrameList
  409. //====================================================================
  410.  
  411. CFrameList::~CFrameList()
  412. {
  413.     Environment* ev = somGetGlobalEnvironment();
  414.     
  415.     LinkedListIterator    iter(&fList);
  416.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  417.     {
  418.         iter.RemoveCurrent();
  419.         delete link;
  420.     }
  421. }
  422.  
  423. ODBoolean CFrameList::Contains(const ODFrame* frame)
  424. {
  425.     if ( fList.IsEmpty() ) return kODFalse;
  426.     
  427.     Environment* ev = somGetGlobalEnvironment();
  428.  
  429.     LinkedListIterator    iter(&fList);
  430.     for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  431.     {
  432.         if ( ODObjectsAreEqual(ev, ((CFrameLink*)link)->GetFrame(), (ODFrame*)frame) )
  433.             return kODTrue;
  434.     }
  435.  
  436.     return kODFalse;
  437. }
  438.  
  439. void CFrameList::Remove(ODFrame* frame)
  440. {
  441.     Environment* ev = somGetGlobalEnvironment();
  442.     Link* link = kODNULL;
  443.     
  444.     LinkedListIterator    iter(&fList);
  445.     for ( link=iter.First();iter.IsNotComplete();link=iter.Next())
  446.     {
  447.         if ( ODObjectsAreEqual(ev, ((CFrameLink*)link)->GetFrame(), frame) )
  448.             break;
  449.     }
  450.     
  451.     fList.Remove(*link);
  452.     delete link;
  453. }
  454.  
  455. void CFrameList::Add(ODFrame* frame)
  456. {
  457.     CFrameLink* link = new CFrameLink(frame);
  458.     fList.AddLast(link);
  459. }
  460.  
  461. ODFrame* CFrameList::GetFrame()
  462. {
  463.     CFrameLink* link = (CFrameLink*) fList.First();
  464.     return link->GetFrame();
  465. }
  466.  
  467. //====================================================================
  468. // CFrameListIterator
  469. //====================================================================
  470.  
  471. CFrameListIterator::CFrameListIterator(CFrameList* list)
  472. {
  473.     fIter = new LinkedListIterator(&list->fList);
  474. }
  475.  
  476. CFrameListIterator::~CFrameListIterator()
  477. {
  478.     delete fIter;
  479. }
  480.     
  481. ODFrame* CFrameListIterator::First()
  482. {
  483.     CFrameLink* link = (CFrameLink*) fIter->First();
  484.     return link ? link->GetFrame() : kODNULL;
  485. }
  486.  
  487. ODFrame* CFrameListIterator::Next()
  488. {
  489.     CFrameLink* link = (CFrameLink*) fIter->Next();
  490.     return link ? link->GetFrame() : kODNULL;
  491. }
  492.  
  493. ODFrame* CFrameListIterator::Previous()
  494. {
  495.     CFrameLink* link = (CFrameLink*) fIter->Previous();
  496.     return link ? link->GetFrame() : kODNULL;
  497. }
  498.  
  499. ODFrame* CFrameListIterator::Last()
  500. {
  501.     CFrameLink* link = (CFrameLink*) fIter->Last();
  502.     return link ? link->GetFrame() : kODNULL;
  503. }
  504.  
  505. ODFrame* CFrameListIterator::Current()
  506. {
  507.     CFrameLink* link = (CFrameLink*) fIter->Current();
  508.     return link ? link->GetFrame() : kODNULL;
  509. }
  510.  
  511. ODBoolean CFrameListIterator::IsNotComplete()
  512. {
  513.     return fIter->IsNotComplete();
  514. }
  515.  
  516. void CFrameListIterator::ReleaseCurrent()
  517. {
  518.     Environment* ev = somGetGlobalEnvironment();
  519.  
  520.     CFrameLink* link = (CFrameLink*) fIter->Current();
  521.     if ( link )
  522.         link->GetFrame()->Release(ev);
  523.     fIter->RemoveCurrent();
  524. }
  525.  
  526. //====================================================================
  527. // CStack
  528. //====================================================================
  529.  
  530. void CStack::EmptyStack(ODBoolean deleteEntries)
  531. {
  532.     if ( deleteEntries )
  533.     {
  534.         LinkedListIterator    iter(&fStack);
  535.         for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  536.         {
  537.             delete (((CGenericLink*)link)->GetValue());
  538.             fStack.Remove(*link);
  539.         }
  540.     }
  541.     else
  542.         fStack.DeleteAllLinks();
  543. }
  544.  
  545. ODUShort CStack::SetSize(ODUShort maxDepth)
  546. {
  547.     ODULong curSize = fStack.Count();
  548.     
  549.     if ( curSize > maxDepth )
  550.         fMaxDepth = (ODUShort) curSize;
  551.     else
  552.         fMaxDepth = maxDepth;
  553.     
  554.     return fMaxDepth;
  555. }
  556.  
  557. ODBoolean CStack::PushEntry(ODPtr entry)
  558. {
  559.     if ( (ODUShort)fStack.Count() < fMaxDepth )
  560.     {
  561.         CGenericLink* link = new CGenericLink(entry);
  562.         fStack.AddFirst(link);
  563.         return kODTrue;
  564.     }
  565.     else
  566.         return kODFalse;
  567. }
  568.  
  569. ODPtr CStack::PopEntry()
  570. {
  571.     if ( fStack.IsEmpty() )
  572.         return kODNULL;
  573.     else
  574.     {
  575.         CGenericLink* link = (CGenericLink*)fStack.RemoveFirst();
  576.         return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  577.     }
  578. }
  579.  
  580.  
  581. //====================================================================
  582. // CQueue
  583. //====================================================================
  584.  
  585. void CQueue::EmptyQueue(ODBoolean deleteEntries)
  586. {
  587.     if ( deleteEntries )
  588.     {
  589.         LinkedListIterator    iter(&fQueue);
  590.         for (Link* link=iter.First();iter.IsNotComplete();link=iter.Next())
  591.         {
  592.             delete (((CGenericLink*)link)->GetValue());
  593.             fQueue.Remove(*link);
  594.         }
  595.     }
  596.     else
  597.         fQueue.DeleteAllLinks();
  598. }
  599.  
  600. ODUShort CQueue::SetSize(ODUShort maxEntries)
  601. {
  602.     ODULong curSize = fQueue.Count();
  603.     
  604.     if ( curSize > maxEntries )
  605.         fMaxEntries = (ODUShort) curSize;
  606.     else
  607.         fMaxEntries = maxEntries;
  608.     
  609.     return fMaxEntries;
  610. }
  611.  
  612. ODBoolean CQueue::AddEntry(ODPtr entry)
  613. {
  614.     if ( (ODUShort)fQueue.Count() < fMaxEntries )
  615.     {
  616.         CGenericLink* link = new CGenericLink(entry);
  617.         fQueue.AddLast(link);
  618.         return kODTrue;
  619.     }
  620.     else
  621.         return kODFalse;
  622. }
  623.  
  624. ODPtr CQueue::GetEntry()
  625. {
  626.     if ( fQueue.IsEmpty() )
  627.         return kODNULL;
  628.     else
  629.     {
  630.         CGenericLink* link = (CGenericLink*)fQueue.RemoveFirst();
  631.         return link ? (ODPtr) link->GetValue() : (ODPtr)kODNULL;
  632.     }
  633. }
  634.  
  635.